/**
 *	模型主Model
 *	开发者：雨中磐石
 *	地址：www.rockoa.com
 *	日期：2023-07-19
 */


package com.framework.ACore;

import com.framerock.db.DB;
import com.framerock.db.DBConn;
import com.framerock.db.DBWhere;
import com.framerock.server.Request;
import com.framerock.baselib.CallBack;
import com.framerock.baselib.Rock;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * 模型主Model
 * */
public class Model {

    /**
     * 表名不带前缀
     * */
    protected String tablename      = "";

    /**
     * 完整表名
     * */
    protected String tablenameal    = "";//完整表名

    protected Request mRequest      = null;
    protected DBConn nDb;

    protected void initModel() { }

    /**
     * id对应信息Map
     * */
    protected Map<String, Map<String, String>> XinxiInfo;

    public Model(DBConn dbs){
        this.nDb        = dbs;
        this.XinxiInfo  = new HashMap<String, Map<String, String>>();
        initModel();
    }

    /**
     * 初始化基础的Model模型
     * */
    public static Model get(DBConn dbs, String table, Request req)
    {
        Model obj = new Model(dbs);
        obj.setRequest(req);
        obj.setTable(table);
        return obj;
    }
    public static Model get(DBConn dbs, String table)
    {
        return get(dbs,table, null);
    }

    /**
     * 设置表名
     * */
    protected void setTable(String tab)
    {
        this.tablename = tab;
        if(Rock.isEmpt(tablenameal))tablenameal = DB.chuliPerfix(tab);
    }

    public void setRequest(Request req)
    {
        this.mRequest = req;
    }


    /**
     * 返回单行的
     * @param where sql条件
     * @param fields 字段默认*，多个,分开
     * */
    public Map<String,String> getOne(String where, String fields)
    {
        return this.nDb.getOne(tablenameal, where, fields);
    }

    /**
     * 返回单行的
     * @param where sql条件
     * */
    public Map<String,String> getOne(String where){ return getOne(where, "*"); }

    /**
     * 更新
     * @param upcont 更新内容，如`abc`=1
     * @param where 更新sql条件
     * */
    public Boolean update(String upcont, String where)
    {
        return this.nDb.update(tablenameal, upcont, where);
    }

    /**
     * 更新
     * @param da 更新内容Map
     * @param where 更新SQL条件
     * */
    public Boolean update(Map<String,String> da, String where)
    {
        return this.nDb.update(tablenameal, da, where);
    }

    /**
     * 删除
     * @param where 删除SQL条件
     * */
    public Boolean delete(String where)
    {
        return this.nDb.delete(tablenameal, where);
    }

    /**
     * 新增
     * @param da Map记录
     * @return 返回新增记录id
     * */
    public int insert(Map<String,String> da)
    {
        return this.nDb.insert(tablenameal, da);
    }

    /**
     * 新增
     * @param da Map记录
     * @return 返回是否新增成功
     * */
    public Boolean insertbo(Map<String,String> da)
    {
        return this.nDb.insertbo(tablenameal, da);
    }

    /**
     * 错误信息
     * */
    public String error()
    {
        return this.nDb.error();
    }

    /**
     * 获取所有记录
     * @param where sql条件
     * @param fields 字段默认*，多个,分开
     * @param order 排序如，id desc
     * @param limit 要显示记录0就是显示全部
     * @param call 数据额外处理
     * */
    public ArrayList<Map<String, String>> getAll(String where, String fields, String order, int limit, CallBack call)
    {
        String sql = "SELECT "+DB.chuliFields(fields)+" FROM "+DB.chuliTable(tablenameal)+" WHERE "+where+"";
        if(!Rock.isEmpt(order))sql+=" ORDER BY "+order+"";
        if(limit >0)sql+=" LIMIT "+limit+"";
        return this.nDb.getAll(sql, call);
    }

    /**
     * 获取所有记录
     * @param where sql条件
     * @param fields 字段默认*，多个,分开
     * @param order 排序如，id desc
     * @param limit 要显示记录0就是显示全部
     * */
    public ArrayList<Map<String, String>> getAll(String where, String fields, String order, int limit)
    {
        return getAll(where, fields, order, limit, null);
    }

    /**
     * 获取所有记录
     * @param where sql条件
     * @param fields 字段默认*，多个,分开
     * @param order 排序如，id desc
     * */
    public ArrayList<Map<String, String>> getAll(String where, String fields, String order)
    {
        return getAll(where, fields, order, 0, null);
    }

    /**
     * 获取所有记录
     * @param where sql条件
     * @param fields 字段默认*，多个,分开
     * */
    public ArrayList<Map<String, String>> getAll(String where, String fields)
    {
        return getAll(where, fields, "",0, null);
    }

    /**
     * 获取所有记录
     * @param where sql条件
     * */
    public ArrayList<Map<String, String>> getAll(String where)
    {
        return getAll(where, "*", "",0, null);
    }

    /**
     * 获取记录
     * @param where sql条件
     * */
    public int getCount(String where)
    {
        return this.nDb.getCount(tablenameal, where);
    }

    /**
     * 获取记录
     * @param dbwhere 条件模型
     * */
    public int getCount(DBWhere dbwhere)
    {
        return getCount(dbwhere.show());
    }


    /**
     * 获取信息id键值Map记录
     * @param id 对应id
     * */
    public Map<String, String> getXinxi(String id)
    {
        Map<String, String> rs = this.XinxiInfo.get(id);
        if(rs != null)return rs;
        rs = this.getOne(id);
        this.XinxiInfo.put(id, rs);
        return  rs;
    }

    /**
     * 关闭数据库
     * */
    public void close()
    {
        this.nDb.close();
    }
}